package com.goat.controller;

import com.goat.model.element.BaseElement;
import com.goat.model.element.Enemy;
import com.goat.model.element.PlayShoter;
import com.goat.model.element.Player;
import com.goat.model.manager.EleManager;
import com.goat.model.manager.GameLoader;
import com.goat.model.manager.enumCls.GameElement;

import javax.swing.*;
import java.util.List;
import java.util.Map;

/**
 * 游戏的主线程，自动化
 * 游戏加载控制，游戏进程控制，游戏关卡控制，游戏人物白动化控制，地图切换，资源释放与读取，游戏的各种判定
 */
//一般建议使用Runnable实现
public class GameThread extends Thread{

    private EleManager eleManager;

    public  GameThread(){
        eleManager=EleManager.getEleManager();
    }

    //主线程！！！
    @Override
    public void run() {
        //游戏开始前   加载游戏资源(人物，场景)
        //游戏进行时   各种游戏判断
        //游戏场景结束  资源回收
        while (true){//可以使用一个变量来控制结束
            gameLoad();
            gameRun();
            gameOver();
            try {
                sleep(10);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }
    }

    //游戏加载
    private void gameLoad() {
        GameLoader.ImageLoad();
        GameLoader.PlayerLoad();
        GameLoader.EnemyLoad();
        GameLoader.MapLoad(5);
    }


    //游戏进行时
    /**
     * 任务说明
     *      1.自动化玩家移动，碰撞，失败
     *      2.新元素的增加
     *      3.暂停。。。
     *      2024/7/3:实现player移动
     */
    private void gameRun() {
        int gameTime=0;
        while (true){
            Map<GameElement, List<BaseElement>> map = eleManager.getGameElements();
            //调用方法
            //1.移动、换装
            moveAndUpdate(map,gameTime);
            //2.碰撞检测(只做子弹与敌人之间的暂时)
            List<BaseElement> Enlist = eleManager.getGameElements().get(GameElement.ENEMY);
            List<BaseElement> ShList = eleManager.getGameElements().get(GameElement.PLAYSHOTER);
            Collide4ShAndEn(Enlist,ShList);
            gameTime++;//唯一的时间控制
                        //一次循环睡10ms，我再算上循环本身耗10ms，也就是1s有50次左右循环
                        //我现在要控制子弹发射间隔(射速)，本质上？？？
                        //我先写着代码试一试
            try {
                sleep(10);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }
    }
    public void moveAndUpdate(Map<GameElement,List<BaseElement>> map,int gameTime){
        GameElement[] gameElements = GameElement.values();
        for (GameElement gameElement :gameElements) {
            List<BaseElement> baseElements = map.get(gameElement);
            //对集合进行具体操作，不建议使用迭代器
            for (int i = baseElements.size()-1; i >=0 ; i--) {
                BaseElement element = baseElements.get(i);
                if(!element.isLive()){
                    baseElements.remove(i);
                    continue;
                }
                element.modelMethodObj(gameTime);
            }
        }
    }
    private void Collide4ShAndEn(List<BaseElement> list1,List<BaseElement> List2) {
        for(int i=0;i<list1.size();i++){
            for (int j = 0; j < List2.size(); j++) {
                //调用碰撞检测方法
                if (list1.get(i).PkCheck(List2.get(j))){
                    list1.get(i).setLive(false);
                    List2.get(j).setLive(false);
                    break;//元素没了要立即退出，逻辑上才说得通
                }
            }
        }
    }






    //游戏场景切换
    private void gameOver() {
    }

}
